﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace DirectorRelation
{
	/// <summary>
	/// Класс сотрудник
	/// </summary>
	class Employee
	{

		/// <summary>
		/// Класс директор, о котором знает каждый сотрудник
		/// Директор один и он известен
		/// Директор недоступен никому, кроме класса Employee
		/// </summary>
		private sealed class Director
		{
			/// <summary>
			/// Текущий объект типа Director создаётся при первом обращении к классу Director
			/// так как сперва происходит инициализации полей класса
			/// </summary>
			static readonly Director CurrentDirector = new Director();
			/// <summary>
			/// Фамилия директора известна (const)
			/// </summary>
			private const string _DirectorName = "Иванов Иван Иваныч";

			/// <summary>
			/// Свойство возвращает имя директора
			/// </summary>
			public string DirectorName
			{
				get
				{
					return _DirectorName;
				}
			}

			/// <summary>
			/// Пустой статический конструктор необходим для потокобезопасности
			/// иначе компилятор пометит объект флагом beforefieldinit
			/// </summary>
			static Director() {}
			/// <summary>
			/// Конструктор по умолчанию для Director (c модификатором internal по умолчанию)
			/// запрещает создание объектов класса Director напрямую через конструктор снаружи
			/// </summary>
			Director(){}

			/// <summary>
			/// internal Статический Метод-фабрика для создания объекта типа Director
			/// возвращает SingleTon Director
			/// </summary>
			/// <returns>Объект Director</returns>
			internal static Director CreateDirector
			{				
				get
				{
					return CurrentDirector;
				}
			}
		}

		/// <summary>
		/// Имя сотрудника
		/// </summary>
		private string _Name;
		public string Name
		{
			get
			{
				return _Name;
			}
		}

		/// <summary>
		/// Директор сотрудника
		/// </summary>
		Director EmplDirector;
		/// <summary>
		/// Конструктор сотрудника
		/// </summary>
		/// <param name="EmplName">Имя сотрудника</param>
		public Employee(string EmplName)
		{
			_Name = EmplName;
			// создаём директора
			Director myDirector = Director.CreateDirector;
			EmplDirector = myDirector;
		}


		/// <summary>
		/// Свойство возвращает имя директора у объекта Работник
		/// </summary>
		public string DirectorName
		{
			get
			{
				return EmplDirector.DirectorName;
			}
		}
		/// <summary>
		/// Переопределим метод ToString
		/// Вернём информацию о работнике
		/// </summary>
		/// <returns></returns>
		public override string ToString()
		{
			if (EmplDirector != null)
				return "Работник: "+ this.Name + " Директор: " + EmplDirector.DirectorName;
			else
				return "Работник: " + this.Name + "Директор: отсутствует";
		}

	}
}
